﻿////1.return语句注意事项
////2.函数的定义声明等
#include <stdio.h>
#define _CRT_SECURE_NO_WARNINGS 1
////int add(int x, int y)
////{
////	int z = 0;
////	z = x + y;
////	//return x + y;
////	return z;
////}
////int main()
////{
////	int i = 0;
////	int j = 0;
////	scanf("%d %d", &i, &j);//  又发现一个错误，就是这个里面%d不能加逗号
////	int  r = add(i,j);
////	printf("%d\n", r);
////
////	return 0;
////}
//
//// return 语句
////在函数的设计中，函数中经常会出现returm语句，这里讲下return语句使用的注意事项。
////
////1.retur后边可以是一个数值，也可以是一个表达式，如果是表达式则先执行表达式，再返回表达式的结果
////2.return后边也可以什么都没有，直接写 return；这种写法适合函数返回类型是void的情况
////3.return语句执行后，函数就彻底返回，后边的代码不再执行。
////4.return 是比break更加彻底，break只是跳出循环
////5.return返回的值和函数返回类型不一致，系统会自动将返回的值隐式转换为函数的返回类型。
////  如果函数中存在if等分支的语句，则要保证每种情况下都有return返回，否则会出现编译错误。
////6.·函数的返回类型如果不写，编译器会默认的数的返回类型是int。
////函数写了返回类型，但是函数中没有使用return回值，那么函数的返回值是未知的。
//
////int test()
////{
////	int n = 5;
////	if (n % 2 == 1)
////		return 1;
////}
////int main()
////{
////	int r = test();
////	printf("%d\n", r);
////	   //“test”: 不是所有的控件路径都返回值
//// 是我的理解有问题了，这句话问题不在没有写return语句，
//// 而是因为我只说了n % 2 = 1的情况，没有说等于零的情况
//// 所以改进措施:
////枚举不是零的情况即可
////	
////}
//
////int test()
////{
////	int n = 5;
////	if (n % 2 == 1)
////		printf("%d", 1);
////	else (n % 2 == 0);  
////		printf("模是零");
////		return 0;
////}
////int main()
////{
////	int r = test();
////	printf("%d\n", r);
////	
////	return 0;
////}
////#include <stdio.h> 
////int test(void)
////{
////	printf("hehe\n");
////	int a = 3 + 5;
////	printf("%d\n", a);
////	return 0;
////}
////int main()
////{
////	int r = test();
////	printf("%d", r);
////	return 0;
////} 
////                        //hehe
////                        //8
//                        //0
////以下是对这段代码输出结果有“0”的分析：
////函数调用及返回值输出
////test 函数的执行
////在 test 函数中，首先打印 "hehe" ，然后计算 a = 3 + 5 并打印 a 的值（即8），
////最后 return 0 。所以当 test 函数被调用时，会依次输出 hehe 和 8 。
////    main 函数中的操作
////在 main 函数中，调用 test 函数并将其返回值赋给 r ，
//// 由于 test 函数返回 0 ，所以 r 的值为 0 。
////然后 printf("%d", r) 会将 r 的值（即 0 ）打印出来。
////总结
////最后输出的那个 0 是因为在 main 函数中，
//// 你将 test 函数的返回值（也就是 0 ）通过 printf 打印了出来。如果不想看到这个 0 ，可以选择不在 main 函数中打印 test 函数的返回值，或者修改 test 函数让它返回其他值（比如 return 1 等）。
//
////      我想让零消失
//
////void test(void)
////{
////	printf("hehe\n");
////	int a = 3 + 5;
////	printf("%d\n", a);
////	return 0;
////}
////int main()
////{
////	int r = test();
////	return 0;
////}
////
////
////以下是一些优化方法让最后的零消失：
////在 test 函数中修改
////方法一：更改返回值
////目前 test 函数总是返回 0 ，可以根据实际需求返回其他有意义的值或者不返回值（将返回类型改为 void ）。例如，如果 test 函数只是用于打印一些信息和计算 a 的值，可以将其返回类型改为 void ，这样在 main 函数中调用 test 函数时就不会打印出 0 了。
//// 
////#include <stdio.h>
////void test(void) 
////{
////    printf("hehe\n");
////    int a = 3 + 5;
////    printf("%d\n", a);
////}
////
////int main() 
////{
////    test();
////    return 0;
////}
//// 
////方法二：有条件返回
////如果 test 函数需要根据某些条件返回不同的值，可以添加条件判断来决定返回值。例如：
//// 
////#include <stdio.h>
////int test(void) 
////{
////    printf("hehe\n");
////    int a = 3 + 5;
////    printf("%d\n", a);
////    // 根据某些条件返回不同的值
////    if (a > 5) 
////    {
////        return 1; 
////    } 
////    else 
////    {
////        return -1; 
////    }
////}
////
////int main() 
////{
////    int r = test();
////    printf("%d", r);
////    return 0;
////}
//// 
////在 main 函数中修改
////方法三：不打印 test 函数的返回值
////直接注释掉 main 函数中打印 test 函数返回值的语句，这样就不会打印出 0 了。
////// 
////#include <stdio.h>
////int test(void) 
////{
////    printf("hehe\n");
////    int a = 3 + 5;
////    printf("%d\n", a);
////    return 0;
////}
////
////int main() 
////{
////    test();
////    /* int r = test();
////     printf("%d", r);*/
////    return 0;
////}
//
//
//////////////////       嵌套调用和链式访问               ////////////////////////
//// 1.嵌套调用就是函数之间的互相调用，每一个函数就像一个乐高零件。函数之间有效的互相调用，最后写出来了相对大型的程序
//
//
////假设计算每年某月有多少天
///*思路整理：
//1.肯定要用到数组，设定一个变量，输入一则对应一月，同理，所以我需要在数组中设定1-12
//2.考虑特殊情况闰年29天（闰年/ 4 == 0,并且 / 100 != 0,| 且/ 400 ！= 0*/
//            //              很棒呀！！！！！！！！！！！
////#include <stdio.h>
////
////int main()
////{
////    int i = 0;
////    int j = 0;
////    int arr2[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
////    scanf("%d %d", &i,&j);
////    if (i % 4 == 0 && i % 400 != 0 && i % 400 != 0)
////    {
////        arr2[j]++;
////        printf("%d",arr2[j]);
////        goto tiao;
////    }
////   
////    else
////        printf("%d",arr2[j]);
////    tiao:
////    return 0;
////}
//int is_leap_year(x)
//{
//    if (((x % 4 == 0) && (x % 100 != 0)) || (x % 400 == 0))
//        return 1;
//    else
//        return 0;
//}
//int get_days_of_month(int x, int y)
//{
//    int days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
//    int d = days[y];
//    if (is_leap_year(x) && y == 2)
//        d += 1;
//    return d;
//
//}
//
//
//int main()
//{
//    int year = 0;
//    int month = 0;
//    scanf("%d %d", &year, &month);
//
//    int d = get_days_of_month(year, month);
//    printf("%d",d)
//
//    return 0;
//}
//写一个函数将数组arr的内容全部置为 - 1
//void set_arr(int arr[], int sz)
//{
//	int i = 0;
//	int j = 0;
//	for (j = 0;j < sz;j++)
//	{
//		scanf_s("%d", &arr[j]);
//	}
//	
//	for (i = 0;i < sz;i++)
//	{
//		printf("%d", -1);
//	}
//	printf("\n");
//}
//
//
//int main()
//
//{
//	int arr1[10] = {0};
//	int sz = sizeof(arr1) / sizeof(arr1[0]);
//	set_arr(arr1, sz);
//	return 0;
//}

//void Print(int brr[3][5], int r, int c)
//{
//	int i = 0;
//	for (i = 0; i < r; i++)
//	{
//		int j = 0;
//		for (j = 0; j < c; j++)
//		{
//			printf("%d ", brr[i][j]);
//		}
//		printf("\n");
//	}
//}
//


//static int g_val = 2025;
//
//static void test()
//{
//	printf("2: g_val = %d\n", g_val);
//}
//函数也是默认就具有外部链接属性
//只要适当的声明，就可以在其他的.c文件中使用
//但是函数被static修饰后，这个函数的外部链接属性就变成了
//内部链接属性，也就是说这个函数只能在自己所在的.c文件内使用


//                             错误大赏：！！！！！！！！！！！！！
//你的代码在拆分函数时存在以下几个问题：
//
//1. 函数参数冗余且未使用
//
//int input(int a, int b) // a和b参数未被使用
//int output(int x, int y) // x和y参数未被使用
//
//
//- 问题：参数 a 、 b 、 x 、 y 在函数内部未被使用，属于冗余参数。
//
//- 修正：直接删除这些参数。
//
//2. 全局变量的副作用
//int arr[3][5] = { 0 };
//int i = 0;
//int j = 0;
//
//问题：全局变量 i 、 j 被多个函数共享，可能导致不可控的副作用（例如 input 修改 i 后影响 output ）。
//
//- 修正：在函数内部定义局部变量，避免依赖全局变量。
//
//3. 函数未被调用
//int main()
//{
//    int input();  // 仅声明函数，未调用
//    int output(); // 仅声明函数，未调用
//    return 0;
//}
//
//
//- 问题： main 函数中没有实际调用 input 和 output 函数，程序不会执行输入输出逻辑。
//
//- 修正：直接调用函数（如 input(); 
//
//
//4. 函数声明冗余
//
//int main()
//{
//    int input();  // 重复声明已定义的函数
//    int output(); // 重复声明已定义的函数
//    return 0;
//}
//
//
//- 问题： input 和 output 函数在 main 之前已经定义，无需在 main 内部再次声明。
//
//- 修正：删除 main 中的声明。
//
//5. 代码结构优化建议
//
//- 传递数组参数：建议将数组作为参数传递给函数，避免依赖全局变量。
//
//- 明确函数功能：函数参数应与功能匹配（如传递行数、列数）。
//
//修正后的代码
//
//#include <stdio.h>
//
//// 输入函数，参数为数组及其维度
//void input(int arr[][5], int rows, int cols)
//{
//    for (int i = 0; i < rows; i++) 
//    {
//        for (int j = 0; j < cols; j++) 
//        {
//            scanf_s("%d", &arr[i][j]);
//        }
//    }
//}
//
//// 输出函数，参数为数组及其维度
//void output(int arr[][5], int rows, int cols)
// {
//    for (int i = 0; i < rows; i++) 
// {
//        for (int j = 0; j < cols; j++) 
// {
//            printf("%d ", arr[i][j]);
//        }
//        printf("\n");
//    }
//}
//
//int main() {
//    int arr[3][5] = { 0 };
//
//    // 调用函数并传递参数
//    input(arr, 3, 5);
//    output(arr, 3, 5);
//
//    return 0;
//}
//
//
//改进说明
//
//1. 移除冗余参数： input 和 output 函数参数改为传递数组及其维度。
//
//2. 避免全局变量： i 、 j 作为函数内部的局部变量。
//
//3. 明确函数调用：在 main 中调用 input 和 output 。
//
//4. 提高代码可读性：通过参数传递数组信息，使函数功能更清晰。
//

//#include <stdio.h>
//int arr[3][5] = { 0 };
//int i = 0;
//int j = 0;
//int input(int a,int b)
//{
//	for (i = 0; i < 3; i++)
//	{
//		for (j = 0; j < 5;j++)
//			scanf_s("%d", &arr[i][j]);
//	}
//
//}
//int output(int x,int y)
//{
//	for (i = 0; i < 3; i++)
//	{
//		for (j = 0; j < 5;j++)
//			printf("%d", arr[i][j]);
//	}
//}
//
//int main()
//{
//	int input();
//	int output();
//	return 0;
//}
void intput(int arr[][5],int i,int j )

{
    int x = 0;
    int y = 0;
    for (x = 0;x < i;x++)
    {
        for (y = 0;y < j;y++)
        {
            scanf_s("%d", &arr[x][y]);
        }

    }
}
void output(int arr[][5],int i,int j)
{
    int x = 0;
    int y = 0;
    for (x = 0;x < i;x++)
    {
        for (y = 0;y < j;y++)
        {
           printf("%d", arr[x][y]);
        }
        printf("\n");
    }
}
int main()
{
    int arr[][5] = { 0 };
    intput(arr, 3, 5);
    output(arr, 3, 5);
    return 0;
}